
package oris.components;

import javax.swing.JFrame;

/**
 * Thread para rendimensionamento.
 * Utilizando-se a thread, permite um menor trabalho do processamento.
 * @author ateixeira
 */
public class ResizeThread {
    private int width;
    private int height;
    private int locationX;
    private int locationY;
    private JFrame frame;
    private boolean isResizing = false;

    /**
     * Constrói a thread.
     * A thread só é iniciada após chamar o método startResizing.
     * @param frame O componente a ser redimensionado
     */
    public ResizeThread(JFrame frame) {
        this.frame = frame;
        this.width = frame.getSize().width;
        this.height = frame.getSize().height;
        
        this.locationX = frame.getLocation().x;
        this.locationY = frame.getLocation().y;
    }

    /**
     * Atualiza a thread com as novas dimensões.
     * @param width A nova largura.
     * @param height A nova altura.
     * @param locationX A nova posição no eixo X.
     * @param locationY A nova posição no eixo Y.
     */
    public void update(int width, int height, int locationX, int locationY) {
        this.width = width;
        this.height = height;

        this.locationX = locationX;
        this.locationY = locationY;
        
        //this.frame.setLocation(locationX, locationY);
    }

    /**
     * Inicia o funcionamento da thread.
     */
    public void startResizing() {
        isResizing = true;
        new Thread(new Resize()).start();
    }
    
    /**
     * Pára o funcionamento da thread.
     */
    public void stopResizing() {
        this.isResizing = false;
    }

    /**
     * Verifica se a thread está em funcionamento.
     * @return Verdadeiro se ela está funcionando.
     */
    public boolean isResizing() {
        return isResizing;
    }

    private class Resize implements Runnable{
        
        @Override
        public void run() {
            while (isResizing) {
                frame.setSize(width, height);
                frame.setLocation(locationX, locationY);
                
                frame.getContentPane().invalidate();
                frame.getContentPane().validate();

                //Dá um tempo a thread
                //Necessário para não consumir muito a cpu
                try {
                    Thread.sleep(50);
                }
                catch (InterruptedException e){}
            }
        }
        
    }
    
}
